<--- %%NOBANNER%% --> parsedate.sas
 BackForward

/*-------------------<-- Start of Description-->---------------------\
| Check a date variable;                                             |
| Input variable must be a string (yyyymmdd);                        |
|---------------------<-- End of Description-->----------------------|
|--------------------------------------------------------------------|
|------------<-- Start of Files or Arguments Needed-->---------------|
| Arguments neede:                                                   |
|    invar : input variable;                                         |
|    outvar: the output variable name;                               |
|    sql   : where is this function used, within a sql statement or  |
|            within a datastep;                                      |
|---------------<-- End of Files Arguments Needed-->-----------------|
|--------------------------------------------------------------------|
|------------------<-- Start of Files Created-->---------------------|
| Usage: %parsedate(invar, outvar, sql);                             |
\-------------------<-- End of Files Created-->---------------------*/
%macro parsedate(invar, outvar, sql);
/*--------------------------------------------\
| Copy Right: Duo Zhou;                       |
| Created:  3-11-2002 9:12pm;                 |
| Purpose: Parse a date variable;             |
\--------------------------------------------*/
%if (%quote(&outvar) eq) %then %do;
   %let outvar=&invar;
%end;
%if (%quote(%upcase(&sql)) eq SQL) %then %do;
   case 
      when missing(&invar) then .
      when length(&invar) < 4 and not missing(&invar) then .
      when length(&invar) >= 4 and length(&invar) < 6 then (INPUT((SUBSTR(&invar,1,4)||'1231'), YYMMDD8.)+INPUT((SUBSTR(&invar,1,4)||'0101'), YYMMDD8.)+1)/2
      when length(&invar) >= 6 and length(&invar) < 8 then (INPUT((SUBSTR(&invar,1,6)||'01'), YYMMDD8.) + 15)
      else INPUT(SUBSTR(&invar,1,8), YYMMDD8.)
   end as &outvar 
%end;
%else %if (%quote(%upcase(&sql)) ne SQL) %then %do;
   if length(&invar) < 4 and not missing(&invar) then &outvar=.;
   else if length(&invar) >= 4 and length(&invar) < 6 then 
      &outvar = (INPUT((SUBSTR(&invar,1,4)||'1231'), YYMMDD8.) + 
                INPUT((SUBSTR(&invar,1,4)||'0101'), YYMMDD8.)+1)/2;
   else if length(&invar) >= 6 and length(&invar) < 8 then 
      &outvar = (INPUT((SUBSTR(&invar,1,6)||'01'), YYMMDD8.) + 15);
   else &outvar = INPUT(SUBSTR(&invar,1,8), YYMMDD8.);
%end;
%mend parsedate;